\subsection{Еще кое-что о дополнительном коде}

\epigraph{Exercise 2-1. Write a program to determine the ranges of \TT{char}, \TT{short}, \TT{int}, and \TT{long}
variables, both \TT{signed} and \TT{unsigned}, by printing appropriate values from standard headers
and by direct computation.}{\KRBook}

\subsubsection{Получение максимального числа для некоторого \glslink{word}{слова}}

Максимальное беззнаковое число это просто число, где все биты выставлены: \IT{0xFF....FF}
(это -1 если \glslink{word}{слово} используется как знаковое целочисленное).
Так что берете \glslink{word}{слово}, и выставляете все биты для получения значения:

\begin{lstlisting}[style=customc]
#include <stdio.h>

int main()
{
	unsigned int val=~0; // замените на "unsigned char" чтобы узнать макс.значение для беззнакового 8-битного байта
	// 0-1 также сработает, или просто -1
	printf ("%u\n", val); // %u для беззнакового
};
\end{lstlisting}

Для 32-битного целочисленного это 4294967295.

\subsubsection{Получение минимального числа для некоторого знакового \glslink{word}{слова}}

Минимальное знаковое число кодируется как \IT{0x80....00}, т.е., самый старший бит выставлен, остальные сброшены.
Максимальное знаковое число кодируется также, только все биты инвертированы: \IT{0x7F....FF}.

Будем сдвигать один бит влево, пока он не исчезнет:

\begin{lstlisting}[style=customc]
#include <stdio.h>

int main()
{
	signed int val=1; // замените на "signed char" чтобы найти значения для знакового байта
	while (val!=0)
	{
		printf ("%d %d\n", val, ~val);
		val=val<<1;
	};
};
\end{lstlisting}

Результат:

\begin{lstlisting}
...

536870912 -536870913
1073741824 -1073741825
-2147483648 2147483647
\end{lstlisting}

Два последних числа это соответственно минимум и максимум для знакового 32-битного \IT{int}.

